package com.wei.czz.framework.blog.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.audit.BlogAuditDto;
import com.wei.czz.common.dto.blog.audit.BlogAuditListDto;
import com.wei.czz.common.dto.blog.audit.BlogAuditPageEnumDto;
import com.wei.czz.common.dto.blog.audit.group.BlogAuditGroupAssignStatDto;
import com.wei.czz.common.enums.blog.audit.AuditStatusEnum;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.audit.BlogAuditAssignVo;
import com.wei.czz.common.vo.blog.audit.BlogAuditFormVo;
import com.wei.czz.common.vo.blog.audit.BlogAuditVo;
import com.wei.czz.framework.blog.manager.BlogAuditManager;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import lombok.AllArgsConstructor;

import java.util.List;
import java.util.Objects;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2024-11-29 20:24:48
 * className: BlogAuditController
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/blog/audit")
@AllArgsConstructor
public class BlogAuditController {

    private static final Logger log = LoggerFactory.getLogger(BlogAuditController.class);

    private final BlogAuditManager blogAuditManager;

    /**
     * 分页获取博客审核记录接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核管理页面调用
     * @param blogAuditFormVo 参数对象
     * @return 结果
     */
    @PostMapping("/page/list")
    @Auth(permit = "blog:audit:list")
    public Result<PageDto<BlogAuditListDto>> getBlogAuditPageList(@Validated(Search.class) @RequestBody BlogAuditFormVo blogAuditFormVo) {
        log.info("开始分页获取博客审核记录业务。{}", blogAuditFormVo);

        PageDto<BlogAuditListDto> pageDto = blogAuditManager.getBlogAuditPageList(blogAuditFormVo);

        log.info("分页获取博客审核记录业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取博客审核记录管理页面枚举接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核管理页面调用
     * @return 结果
     */
    @GetMapping("/page/enum")
    @Auth(permit = "blog:audit:list")
    public Result<BlogAuditPageEnumDto> getBlogAuditPageEnum() {
        log.info("开始获取博客审核记录管理页面枚举业务");

        BlogAuditPageEnumDto blogAuditPageEnumDto = blogAuditManager.getBlogAuditPageEnum();

        log.info("获取博客审核记录管理页面枚举业务结束");
        return Result.success(blogAuditPageEnumDto);
    }

    /**
     * 分页获取用户博客审核记录接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-我的审核页面调用
     * @param blogAuditFormVo 参数对象
     * @return 结果
     */
    @PostMapping("/self/page/list")
    @Auth(permit = "blog:audit:self:list")
    public Result<PageDto<BlogAuditListDto>> getBlogSelfAuditPageList(@Validated(Search.class) @RequestBody BlogAuditFormVo blogAuditFormVo) {
        log.info("开始分页获取用户博客审核记录业务。{}", blogAuditFormVo);

        PageDto<BlogAuditListDto> pageDto = blogAuditManager.getBlogSelfAuditPageList(blogAuditFormVo);

        log.info("分页获取用户博客审核记录业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取我的审核页面枚举接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-我的审核页面调用
     * @return 结果
     */
    @GetMapping("/self/page/enum")
    @Auth(permit = "blog:audit:self:list")
    public Result<BlogAuditPageEnumDto> getBlogSelfAuditPageEnum() {
        log.info("开始获取我的审核页面枚举业务");

        BlogAuditPageEnumDto blogAuditPageEnumDto = blogAuditManager.getBlogSelfAuditPageEnum();

        log.info("获取我的审核页面枚举业务结束");
        return Result.success(blogAuditPageEnumDto);
    }

    /**
     * 获取博客审核分组分配统计列表接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核管理页面调用
     * @return 结果
     */
    @GetMapping("/group/assign/stat/list")
    @Auth(permit = "blog:audit:list")
    public Result<List<BlogAuditGroupAssignStatDto>> getBlogAuditGroupAssignStatList() {
        log.info("开始获取博客审核分组分配统计列表业务");

        List<BlogAuditGroupAssignStatDto> blogAuditGroupAssignStatDtoList = blogAuditManager.getBlogAuditGroupAssignStatList();

        log.info("获取博客审核分组分配统计列表业务结束");
        return Result.success(blogAuditGroupAssignStatDtoList);
    }

    /**
     * 获取待审核博客接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核页面调用
     * @param id 博客审核主键
     * @return 结果
     */
    @GetMapping("/get")
    @Auth(permit = "blog:audit:self:get")
    public Result<BlogAuditDto> getWaitAuditBlog(@RequestParam("id") Long id) {
        log.info("开始获取待审核博客业务。id={}", id);

        BlogAuditDto blogAuditDto = blogAuditManager.getWaitAuditBlog(id);

        log.info("获取待审核博客业务结束");
        return Result.success(blogAuditDto);
    }

    /**
     * 博客审核分配接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核管理页面调用
     * @param blogAuditAssignVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'blogAuditAssign' + #userId", message = "博客审核分配")
    @PostMapping("/assign")
    @Auth(permit = "blog:audit:assign")
    public Result<Object> blogAuditAssign(@Validated @RequestBody BlogAuditAssignVo blogAuditAssignVo) {
        log.info("开始博客审核分配业务。{}", blogAuditAssignVo);

        blogAuditManager.blogAuditAssign(blogAuditAssignVo);

        log.info("博客审核分配业务结束");
        return Result.success();
    }

    /**
     * 博客审核转派接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核管理页面调用
     * @param blogAuditAssignVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'blogAuditTransfer' + #userId", message = "博客审核转派")
    @PostMapping("/transfer")
    @Auth(permit = "blog:audit:assign")
    public Result<Object> blogAuditTransfer(@Validated @RequestBody BlogAuditAssignVo blogAuditAssignVo) {
        log.info("开始博客审核转派业务。{}", blogAuditAssignVo);

        blogAuditManager.blogAuditTransfer(blogAuditAssignVo);

        log.info("博客审核转派业务结束");
        return Result.success();
    }

    /**
     * 博客审核接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客审核页面调用
     * @param blogAuditVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'blogAudit' + #userId", message = "博客审核")
    @PostMapping("/audit")
    @Auth(permit = "blog:audit")
    public Result<Object> blogAudit(@Validated @RequestBody BlogAuditVo blogAuditVo) {
        log.info("开始博客审核业务。{}", blogAuditVo);

        if (AuditStatusEnum.REJECT.getValue().equals(blogAuditVo.getAuditStatus())) {
            if (Objects.isNull(blogAuditVo.getAuditRejectType())) {
                return Result.clientFail("审核拒绝类型不能为空");
            }
            if (StringUtils.isBlank(blogAuditVo.getAuditRemark())) {
                return Result.clientFail("审核备注不能为空");
            }
        }

        blogAuditManager.blogAudit(blogAuditVo);

        log.info("博客审核业务结束");
        return Result.success();
    }

}
